package com.cvmars.jianyou.widget;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.cvmars.jianyou.R;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by hehaifeng on 2018/12/11.
 */

public class LoadingLayout extends FrameLayout {


    public interface OnInflateListener {
        void onInflate(View inflated);
    }

    public static LoadingLayout wrap(Activity activity) {
        return wrap(((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0));
    }

    public static LoadingLayout wrap(Fragment fragment) {
        return wrap(fragment.getView());
    }

    public static LoadingLayout wrap(View view) {
        if (view == null) {
            throw new RuntimeException("content view can not be null");
        }
        ViewGroup parent = (ViewGroup) view.getParent();
        if (view == null) {
            throw new RuntimeException("parent view can not be null");
        }
        ViewGroup.LayoutParams lp = view.getLayoutParams();
        int index = parent.indexOfChild(view);
        parent.removeView(view);

        LoadingLayout layout = new LoadingLayout(view.getContext());
        parent.addView(layout, index, lp);
        layout.addView(view);
        layout.setContentView(view);
        return layout;
    }

    int mEmptyImage;
//    CharSequence mEmptyText;

    int mErrorImage;
//    CharSequence mErrorText, mRetryText;

//    CharSequence mNewLinkErrorText;

    View.OnClickListener mRetryButtonClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mRetryListener != null) {
                mRetryListener.onClick(v);
            }
        }
    };
    View.OnClickListener mRetryListener;

    OnInflateListener mOnEmptyInflateListener;
    OnInflateListener mOnErrorInflateListener;

    int mTextColor, mTextSize;
    int mButtonTextColor, mButtonTextSize;
    Drawable mButtonBackground;

    OnInflateListener mOnNetLinkErrorInflateListener;
    int mEmptyResId = NO_ID, mLoadingResId = NO_ID, mErrorResId = NO_ID, mNetLinkErrorResId = NO_ID;
    int mContentId = NO_ID;

    Map<Integer, View> mLayouts = new HashMap<>();


    public LoadingLayout(Context context) {
        this(context, null, R.attr.styleLoadingLayout);
    }

    public LoadingLayout(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.styleLoadingLayout);
    }

    public LoadingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

//        this.setBackgroundColor(getResources().getColor(R.color.color_default_bg));
        mInflater = LayoutInflater.from(context);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LoadingLayout, defStyleAttr, R.style.LoadingLayout_Style);


        mEmptyImage = a.getResourceId(R.styleable.LoadingLayout_llEmptyImage, NO_ID);
//        mEmptyText = a.getString(R.styleable.LoadingLayout_llEmptyText);

        mErrorImage = a.getResourceId(R.styleable.LoadingLayout_llErrorImage, NO_ID);
//        mErrorText = a.getString(R.styleable.LoadingLayout_llErrorText);
//        mRetryText = a.getString(R.styleable.LoadingLayout_llRetryText);


//        mNewLinkErrorText = a.getString(R.styleable.LoadingLayout_llNetLinkErrorText);

        mTextColor = a.getColor(R.styleable.LoadingLayout_llTextColor, 0xff999999);
        mTextSize = a.getDimensionPixelSize(R.styleable.LoadingLayout_llTextSize, dp2px(16));

        mButtonTextColor = a.getColor(R.styleable.LoadingLayout_llButtonTextColor, 0xff999999);
        mButtonTextSize = a.getDimensionPixelSize(R.styleable.LoadingLayout_llButtonTextSize, dp2px(16));
        mButtonBackground = a.getDrawable(R.styleable.LoadingLayout_llButtonBackground);

        mEmptyResId = a.getResourceId(R.styleable.LoadingLayout_llEmptyResId, R.layout._loading_layout_empty);
        mLoadingResId = a.getResourceId(R.styleable.LoadingLayout_llLoadingResId, R.layout._loading_layout_loading);
        mErrorResId = a.getResourceId(R.styleable.LoadingLayout_llErrorResId, R.layout._loading_layout_error);
        mNetLinkErrorResId = a.getResourceId(R.styleable.LoadingLayout_llNetLinkErrorResId, R.layout._loading_layout_netlink_error);
        a.recycle();
    }

    int dp2px(float dp) {
        return (int) (getResources().getDisplayMetrics().density * dp);
    }

    LayoutInflater mInflater;

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        if (getChildCount() == 0) {
            return;
        }
        if (getChildCount() > 1) {
            removeViews(1, getChildCount() - 1);
        }
        View view = getChildAt(0);
        setContentView(view);
    }

    private void setContentView(View view) {
        mContentId = view.getId();
        mLayouts.put(mContentId, view);
    }


    public LoadingLayout setRetryListener(OnClickListener listener) {
        mRetryListener = listener;
        return this;
    }


    public void showLoading() {
        show(mLoadingResId);
    }

    public void showEmpty() {
        show(mEmptyResId);
    }

    public void showError() {
        show(mErrorResId);
    }

    public void showNetLinkError() {
        show(mNetLinkErrorResId);
    }

    public void showContent() {
        show(mContentId);
    }

    private void show(int layoutId) {
        for (View view : mLayouts.values()) {
            view.setVisibility(GONE);
        }
        layout(layoutId).setVisibility(VISIBLE);
    }

    private void remove(int layoutId) {
        if (mLayouts.containsKey(layoutId)) {
            View vg = mLayouts.remove(layoutId);
            removeView(vg);
        }
    }

    private View layout(int layoutId) {
        if (mLayouts.containsKey(layoutId)) {
            return mLayouts.get(layoutId);
        }
        View layout = mInflater.inflate(layoutId, this, false);
        layout.setVisibility(GONE);
        addView(layout);
        mLayouts.put(layoutId, layout);

        if (layoutId == mEmptyResId) {
            ImageView img = (ImageView) layout.findViewById(R.id.empty_image);
            if (img != null) {
                img.setImageResource(mEmptyImage);
            }
//            TextView view = (TextView) layout.findViewById(R.id.empty_text);
//            if (view != null) {
//                view.setText(mEmptyText);
//                view.setTextColor(mTextColor);
//                view.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
//            }
            if (mOnEmptyInflateListener != null) {
                mOnEmptyInflateListener.onInflate(layout);
            }
        } else if (layoutId == mErrorResId) {
            ImageView img = (ImageView) layout.findViewById(R.id.error_image);
            if (img != null) {
                img.setImageResource(mErrorImage);
//                img.setOnClickListener(mRetryButtonClickListener);
            }
//            TextView txt = (TextView) layout.findViewById(R.id.error_text);
//            if (txt != null) {
////                txt.setText(mErrorText);
//                txt.setTextColor(mTextColor);
//                txt.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
//            }
//            TextView btn = (TextView) layout.findViewById(R.id.retry_button);
//            if (btn != null) {
////                btn.setText(mRetryText);
//                btn.setTextColor(mButtonTextColor);
//                btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonTextSize);
//                btn.setBackground(mButtonBackground);
//                btn.setOnClickListener(mRetryButtonClickListener);
//            }

            layout.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (mRetryListener != null) {
                        mRetryListener.onClick(v);
                    }
                }
            });
            if (mOnErrorInflateListener != null) {
                mOnErrorInflateListener.onInflate(layout);
            }
        } else if (layoutId == mNetLinkErrorResId) {

//            TextView mTxtLinkError = (TextView) layout.findViewById(R.id.linkError_text);

//            mTxtLinkError.setText(mNewLinkErrorText);
        }
        return layout;
    }
}
